/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOProveedor;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.to.ProveedorTO;

/**
 *
 * @author salmuz
 */
@SuppressWarnings({ "unchecked", "rawtypes", "serial" })
@Repository("daoProveedor")
public class DAOProveedorImpl extends DaoImpl<Proveedor, Integer> implements
        IDAOProveedor, Serializable {

    @Transactional
    public Proveedor obtenerEntidadConUbigeo(Integer id) throws DAOException {
        try {
            Proveedor ent = (Proveedor) sessionFactory.getCurrentSession()
                    .createCriteria(Proveedor.class).add(Restrictions.idEq(id))
                    .uniqueResult();
            Hibernate.initialize(ent.getIdUbigeo());

            return ent;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }

    
    @Override
    @Transactional
    public Collection<ProveedorTO> listarProveedorPorTipo()
            throws DAOException {
        try {
            List list = sessionFactory.getCurrentSession().
                    createSQLQuery("select * from cotelasa.f_lista_proveedores_por_tipo()").
                    setResultTransformer(Transformers.aliasToBean(ProveedorTO.class)).
                    list();
            return list;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }

    @Override
    @Transactional
    public Proveedor obtenerProveedorPorRazonSocial(String razonSocial)
            throws DAOException {
        Proveedor proveedor = null;
        try {
            proveedor = (Proveedor) sessionFactory
                    .getCurrentSession()
                    .createCriteria(Proveedor.class)
                    .add(Restrictions.eq("razonSocial", razonSocial))
                    .add(Restrictions.eq("estadoRegistro",
                    ESTADO_REGISTRO.ACTIVO.getValor())).uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return proveedor;
    }

    @Override
    public Proveedor validarRuc(String ruc) throws DAOException {
        Proveedor proveedorBuscado = null;
        try {
            proveedorBuscado = (Proveedor) sessionFactory.getCurrentSession().createCriteria(Proveedor.class)
                    .add(Restrictions.eq("ruc", ruc))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return proveedorBuscado;
    }

    @Override
    public Proveedor validarRazonSocial(String razonSocial) throws DAOException {
        Proveedor proveedorBuscado = null;
        try {
            proveedorBuscado = (Proveedor) sessionFactory.getCurrentSession().createCriteria(Proveedor.class)
                    .add(Restrictions.eq("razonSocial", razonSocial))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return proveedorBuscado;
    }
}
